home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / ruby / 1.8 / un.rb < prev    next >
Text File  |  2007-02-12  |  5KB  |  236 lines

  1. # = un.rb
  2. # Copyright (c) 2003 WATANABE Hirofumi <eban@ruby-lang.org>
  3. # This program is free software.
  4. # You can distribute/modify this program under the same terms of Ruby.
  5. # == Utilities to replace common UNIX commands in Makefiles etc
  6. #
  7. # == SYNOPSIS
  8. #
  9. #   ruby -run -e cp -- [OPTION] SOURCE DEST
  10. #   ruby -run -e ln -- [OPTION] TARGET LINK_NAME
  11. #   ruby -run -e mv -- [OPTION] SOURCE DEST
  12. #   ruby -run -e rm -- [OPTION] FILE
  13. #   ruby -run -e mkdir -- [OPTION] DIRS
  14. #   ruby -run -e rmdir -- [OPTION] DIRS
  15. #   ruby -run -e install -- [OPTION] SOURCE DEST
  16. #   ruby -run -e chmod -- [OPTION] OCTAL-MODE FILE
  17. #   ruby -run -e touch -- [OPTION] FILE
  18. #   ruby -run -e help [COMMAND]
  19.  
  20. require "fileutils"
  21. require "optparse"
  22.  
  23. module FileUtils
  24. #  @fileutils_label = ""
  25.   @fileutils_output = $stdout
  26. end
  27.  
  28. def setup(options = "")
  29.   ARGV.map! do |x|
  30.     case x
  31.     when /^-/
  32.       x.delete "^-#{options}v"
  33.     when /[*?\[{]/
  34.       Dir[x]
  35.     else
  36.       x
  37.     end
  38.   end
  39.   ARGV.flatten!
  40.   ARGV.delete_if{|x| x == "-"}
  41.   opt_hash = {}
  42.   OptionParser.new do |o|
  43.     options.scan(/.:?/) do |s|
  44.       o.on("-" + s.tr(":", " ")) do |val|
  45.         opt_hash[s.delete(":").intern] = val
  46.       end
  47.     end
  48.     o.on("-v") do opt_hash[:verbose] = true end
  49.     o.parse!
  50.   end
  51.   yield ARGV, opt_hash
  52. end
  53.  
  54. ##
  55. # Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY
  56. #
  57. #   ruby -run -e cp -- [OPTION] SOURCE DEST
  58. #
  59. #   -p        preserve file attributes if possible
  60. #   -r        copy recursively
  61. #   -v        verbose
  62. #
  63.  
  64. def cp
  65.   setup("pr") do |argv, options|
  66.     cmd = "cp"
  67.     cmd += "_r" if options.delete :r
  68.     options[:preserve] = true if options.delete :p
  69.     dest = argv.pop
  70.     argv = argv[0] if argv.size == 1
  71.     FileUtils.send cmd, argv, dest, options
  72.   end
  73. end
  74.  
  75. ##
  76. # Create a link to the specified TARGET with LINK_NAME.
  77. #
  78. #   ruby -run -e ln -- [OPTION] TARGET LINK_NAME
  79. #
  80. #   -s        make symbolic links instead of hard links
  81. #   -f        remove existing destination files
  82. #   -v        verbose
  83. #
  84.  
  85. def ln
  86.   setup("sf") do |argv, options|
  87.     cmd = "ln"
  88.     cmd += "_s" if options.delete :s
  89.     options[:force] = true if options.delete :f
  90.     dest = argv.pop
  91.     argv = argv[0] if argv.size == 1
  92.     FileUtils.send cmd, argv, dest, options
  93.   end
  94. end
  95.  
  96. ##
  97. # Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.
  98. #
  99. #   ruby -run -e mv -- [OPTION] SOURCE DEST
  100. #
  101. #   -v        verbose
  102. #
  103.  
  104. def mv
  105.   setup do |argv, options|
  106.     dest = argv.pop
  107.     argv = argv[0] if argv.size == 1
  108.     FileUtils.mv argv, dest, options
  109.   end
  110. end
  111.  
  112. ##
  113. # Remove the FILE
  114. #
  115. #   ruby -run -e rm -- [OPTION] FILE
  116. #
  117. #   -f        ignore nonexistent files
  118. #   -r        remove the contents of directories recursively
  119. #   -v        verbose
  120. #
  121.  
  122. def rm
  123.   setup("fr") do |argv, options|
  124.     cmd = "rm"
  125.     cmd += "_r" if options.delete :r
  126.     options[:force] = true if options.delete :f
  127.     FileUtils.send cmd, argv, options
  128.   end
  129. end
  130.  
  131. ##
  132. # Create the DIR, if they do not already exist.
  133. #
  134. #   ruby -run -e mkdir -- [OPTION] DIR
  135. #
  136. #   -p        no error if existing, make parent directories as needed
  137. #   -v        verbose
  138. #
  139.  
  140. def mkdir
  141.   setup("p") do |argv, options|
  142.     cmd = "mkdir"
  143.     cmd += "_p" if options.delete :p
  144.     FileUtils.send cmd, argv, options
  145.   end
  146. end
  147.  
  148. ##
  149. # Remove the DIR.
  150. #
  151. #   ruby -run -e rmdir -- [OPTION] DIR
  152. #
  153. #   -v        verbose
  154. #
  155.  
  156. def rmdir
  157.   setup do |argv, options|
  158.     FileUtils.rmdir argv, options
  159.   end
  160. end
  161.  
  162. ##
  163. # Copy SOURCE to DEST.
  164. #
  165. #   ruby -run -e install -- [OPTION] SOURCE DEST
  166. #
  167. #   -p        apply access/modification times of SOURCE files to
  168. #          corresponding destination files
  169. #   -m        set permission mode (as in chmod), instead of 0755
  170. #   -v        verbose
  171. #
  172.  
  173. def install
  174.   setup("pm:") do |argv, options|
  175.     options[:mode] = (mode = options.delete :m) ? mode.oct : 0755
  176.     options[:preserve] = true if options.delete :p
  177.     dest = argv.pop
  178.     argv = argv[0] if argv.size == 1
  179.     FileUtils.install argv, dest, options
  180.   end
  181. end
  182.  
  183. ##
  184. # Change the mode of each FILE to OCTAL-MODE.
  185. #
  186. #   ruby -run -e chmod -- [OPTION] OCTAL-MODE FILE
  187. #
  188. #   -v        verbose
  189. #
  190.  
  191. def chmod
  192.   setup do |argv, options|
  193.     mode = argv.shift.oct
  194.     FileUtils.chmod mode, argv, options
  195.   end
  196. end
  197.  
  198. ##
  199. # Update the access and modification times of each FILE to the current time.
  200. #
  201. #   ruby -run -e touch -- [OPTION] FILE
  202. #
  203. #   -v        verbose
  204. #
  205.  
  206. def touch
  207.   setup do |argv, options|
  208.     FileUtils.touch argv, options
  209.   end
  210. end
  211.  
  212. ##
  213. # Display help message.
  214. #
  215. #   ruby -run -e help [COMMAND]
  216. #
  217.  
  218. def help
  219.   setup do |argv,|
  220.     all = argv.empty?
  221.     open(__FILE__) do |me|
  222.       while me.gets("##\n")
  223.     if help = me.gets("\n\n")
  224.       if all or argv.delete help[/-e \w+/].sub(/-e /, "")
  225.         print help.gsub(/^# ?/, "")
  226.       end
  227.     end
  228.       end
  229.     end
  230.   end
  231. end
  232.